﻿using System;
using System.IO;

namespace Ukagaka.Named.Ghost.Shiori
{
	/// <summary>
	/// リクエストを表現します
	/// </summary>
	public class Request : Message, IRequest
	{
		/// <summary>
		/// メソッドの種別を取得します
		/// </summary>
		public Method Method
		{
			get;
			set;
		}

		/// <summary>
		/// メソッドの名称を取得します
		/// </summary>
		public string Name
		{
			get;
			set;
		}

		/// <summary>
		/// リクエストを初期化します
		/// </summary>
		public Request( )
		{
			// nothing
		}

		/// <summary>
		/// リクエストを初期化します
		/// </summary>
		/// <param name="request">リクエスト</param>
		public Request( string request )
		{
			Parse( request );
		}

		/// <summary>
		/// リクエストを取得します
		/// </summary>
		/// <returns>リクエスト</returns>
		public override string ToString( )
		{
			if ( 0 == ( Name ?? "" ).Trim( ).Length )
			{
				return string.Concat( Method, " ", Protocol, "\r\n", base.ToString( ) );
			}
			else
			{
				return string.Concat( Method, " ", Name, " ", Protocol, "\r\n", base.ToString( ) );
			}
		}

		/// <summary>
		/// リクエストを解析します
		/// </summary>
		/// <param name="request">リクエスト</param>
		public override void Parse( string request )
		{
			using ( var sr = new StringReader( request ) )
			{
				var split = sr.ReadLine( ).Split( new char[ ] { ' ' }, 3, StringSplitOptions.RemoveEmptyEntries );

				Method = new Method( split[ 0 ].Trim( ) );

				if ( 2 == split.Length )
				{
					Name = "";
					Protocol = new Protocol( split[ 1 ].Trim( ) );
				}
				else if ( 3 == split.Length )
				{
					Name = split[ 1 ].Trim( );
					Protocol = new Protocol( split[ 2 ].Trim( ) );
				}

				base.Parse( sr.ReadToEnd( ) );
			}
		}
	}

	/// <summary>
	/// リクエストを定義します
	/// </summary>
	public interface IRequest : IMessage
	{
		/// <summary>
		/// メソッドの種別を取得します
		/// </summary>
		Method Method
		{
			get;
		}

		/// <summary>
		/// メソッドの名前を取得します
		/// </summary>
		string Name
		{
			get;
		}
	}
}
